let get_dims img =
  ((Sdlvideo.surface_info img).Sdlvideo.w, (Sdlvideo.surface_info
                                              img).Sdlvideo.h)

(*
  Principe de color2string : on caste la couleur passee en parametre
  en une string contenant un triplet d'entiers contenant, dans
  l'ordre, la composante rouge puis verte puis bleue de la couleur.
*)

let color2string = function
  | (r,g,b) -> "(" ^ (string_of_int r) ^ "," ^ (string_of_int g) ^ ","
    ^ (string_of_int b) ^ ")"
    
(*
  Principe de check : on parcourt une liste contenant les couleurs, si
  la couleur passee en parametre est contenue dans cette liste on
  renvoie faux, sinon vrai.
*)
    
let rec check color = function
    [] -> true
  | c::l when c = color -> false
  | c::l -> check color l ;;

(*let rec check2 color = function
[] -> false
  | (c,v)::l when c = color -> true
  | (c,v)::l -> check2 color l ;;*)

(*
  Principe de contours : on parcourt toute l'image a l'aide de deux
  boucles en comparant ses pixels deux a deux, situes sur la meme
  ligne. S'ils sont differents alors on colore le premier pixel en
  noir.
*)

let rec countColor color = function
[] -> 0
  | e::l when e = color -> 1 + countColor color l
  | e::l -> countColor color l

(*let rec upColor color = function
[] -> []
  | (c,v)::l when c = color -> (c,(v+1))::(upColor color l)
  | (c,v)::l -> (c,v)::(upColor color l)

let getValue listColor =
  let value = ref 1 in
  let rec getValue2 listColor =
    match listColor with
	[] -> !value
      | (c,v)::l when v > !value -> value := v ;
                                    getValue2 l
      | (c,v)::l -> getValue2 l in
  getValue2 listColor

let rec getColor value = function
[] -> invalid_arg "getColor : Liste vide"
  | (c,v)::l when v = value -> c
  | (c,v)::l -> getColor value l

let antibruit exImg brImg i h param =
  let get_width (w, h) = w in
  let get_height (w, h) = h in
  let listeCouleurs = ref [] in
  if ((i <= param) || (h <= param) || (i >= ((get_width (get_dims exImg)) - param))
	   || (h >= (get_height (get_dims exImg) - param))) then
    Sdlvideo.put_pixel_color brImg i h (Sdlvideo.get_pixel_color exImg i h)
  else
    begin
    for a = i - param to i + param do
      for b = h - param to h + param do
	let color = (Sdlvideo.get_pixel_color exImg a b) in
	if check2 color !listeCouleurs then
	  listeCouleurs := upColor color !listeCouleurs
	else
	  listeCouleurs := ((color,1)::(!listeCouleurs)) ;
      done
    done ;
      let finalList = !listeCouleurs in
      Sdlvideo.put_pixel_color brImg i h ((getColor (getValue finalList) finalList)) ;
    end*)
  
let listColors = ref [(0,0,0)]
    
(*let dictionnaire = ref []*)

(*let menage exImg brImg param =
  let get_width (w, h) = w in
  let get_height (w, h) = h in
  for h = 0 to (get_height (get_dims exImg) - 1) do
    for i = 0 to (get_width (get_dims exImg)) do
      antibruit exImg brImg h i param ;
    done
  done*)
  
let main brImg newImg =
  let get_width (w, h) = w in
  let get_height (w, h) = h in
  for h = 0 to (get_height (get_dims brImg) - 1) do
    for i = 0 to (get_width (get_dims brImg)) do
      Sdlvideo.put_pixel_color newImg i h (Sdlvideo.get_pixel_color
					     brImg i h) ;
      if check (Sdlvideo.get_pixel_color brImg i h) !listColors then
	begin
          listColors := ((Sdlvideo.get_pixel_color brImg i
			    h)::(!listColors)) ;
	  (*print_string ("Hauteur pour la couleur " ^
			   (color2string(Sdlvideo.get_pixel_color
					   brImg i h)) ^ " : ") ;
	  let value = read_line () in
	  dictionnaire := ((Sdlvideo.get_pixel_color brImg i h),value)::(!dictionnaire) ;*)
	end ;
      if (Sdlvideo.get_pixel_color brImg i h) <>
	(Sdlvideo.get_pixel_color brImg (i + 1) h) then
	Sdlvideo.put_pixel_color newImg i h (0, 0, 0)
    done
  done ;
  !listColors

(*
  Principe de nbColors : compte le nombre de couleurs que contient la
  liste de couleurs passee en parametre.
*)

let rec nbColors = function
    [] -> 0
  | t::l -> 1 + nbColors l

(* End of File *)
